// 游戏操作规则逻辑模块(玩家移动模块)
import * as map from "./map.js"; // 全部导出地图数据

/**
 * 获取玩家位置
 */
function getPlayerPoint() {
    for (let row = 0; row < map.rowNumber; row++) {
        for (let col = 0; col < map.colNumber; col++) {
            if (map.map[row][col] === map.PLAYER) {
                return {
                    row,
                    col,
                };
            }
        }
    }
    throw new Error("此游戏不能玩没有玩家位置"); // 查找失败
}

/**
 * 获取当前位置的下一个位置信息
 * @param {Number} row
 * @param {Number} col
 * @param {Number} direction
 */
function getNextInfo(row, col, direction) {
    switch (direction) {
        case "left":
            return {
                row,
                col: col - 1,
                value: map.map[row][col - 1],
            };
        case "right":
            return {
                row,
                col: col + 1,
                value: map.map[row][col + 1],
            };
        case "up":
            return {
                row: row - 1,
                col: col,
                value: map.map[row - 1][col],
            };
        case "down":
            return {
                row: row + 1,
                col,
                value: map.map[row + 1][col],
            };
    }
}

/**
 * 将两个坐标进行互换
 * @param {*} point1 坐标1
 * @param {*} point2 坐标2
 */
function exchange(point1, point2) {
    var temp = map.map[point1.row][point1.col];
    map.map[point1.row][point1.col] = map.map[point2.row][point2.col];
    map.map[point2.row][point2.col] = temp;
}

/**
 * 指定方面让玩家移动
 * @param {string} direction 玩家移动的方向 left、right、up、 down
 */
export function playerMove(direction) {
    // 获取玩家位置
    let playerPoint = getPlayerPoint();
    // 获取玩家下一步的位置
    let nextPoint = getNextInfo(playerPoint.row, playerPoint.col, direction);
    // 下个位置为墙时
    if (nextPoint.value === map.WALL) return false; // 直接不处理
    // 不为墙可以移动时
    if (nextPoint.value === map.SPACE) {
        // 移动为空白时（位置进行交互）
        exchange(playerPoint, nextPoint);
        return true;
    }
    // 当下个位置为箱子时
    if (nextPoint.value === map.BOX) {
        // 获取箱子的下个位置
        let boxNextPoint = getNextInfo(nextPoint.row, nextPoint.col, direction);
        // 判断箱子的下个位置
        if (boxNextPoint.value === map.SPACE) {
            // 箱子下个还是空格可以移动 (交换位置)
            exchange(nextPoint, boxNextPoint); // 下个位置与下下个位置交换
            exchange(playerPoint, nextPoint); // 下个位置与玩家交换位置
            return true;
        } else {
            return false;
        }
    }
}

/**
 * 导出是否游戏已经结束
 */
export function isWin() {
    // 判断每个箱子是否都在正确的位置上
    return map.correct.every((item) => {
        return map.map[item.row][item.col] === map.BOX;
    });
}
